package main

import (
	"fmt"
	"log"
	"strconv"
)

func main() {
	// 基本数据类型
	//baseDataType();

	//使用fmt.Sprint转换
	//strConvertNum()

	// string 转其他类型
	//strconvData()

	//指针
	//pointAddress()

	// 标识符
	flagName()

}

func baseDataType() {
	// 1.变量声明
	var age = 18
	var name string
	var num float32 = 1.11
	var isTrue bool
	sex := "男"
	name = "ok"

	log.Println("===========age=========", age)
	log.Println("===========name=========", name)
	log.Println("===========num=========", num)
	log.Println("===========isTrue=========", isTrue)
	log.Println("===========sex=========", sex)

	//	2.一次声明多个变量
	var n1, n2, n3 int
	fmt.Println(n1, n2, n3)

	// 同时多个类型推断
	weight, height, hobby := 130, 188, "干饭"
	fmt.Println(weight, height, hobby)

	var str = "11111" + "222222222" + "3333333333" +
		"4444444444444" + "222222222" + "3333333333" + "4444444444444" +
		"222222222" + "3333333333" + "4444444444444"
	fmt.Println("str", str)

	//	类型转换
	var price = 19.98
	fmt.Println(int8(price))
	// 换行输出
	fmt.Println("%T", price)
	// 打印这个变量的类型
	fmt.Printf("%T", price)
	fmt.Println("%T", float32(31))

	var num2 int8 = 100
	// -127
	fmt.Println("num2", num2+29)
}

func strConvertNum() {
	// 转换为其他进制
	//	%b  表示二进制
	//	%c  该值对应的Unicode码值
	//	%d  表示十进制
	//	%o  八进制
	//	%q  go语法字面值
	//	%x  十六进制，用abcdef表示
	//	%X  十六进制，用ABCDEF表示
	//	%U  表示为Unicode格式，U+1234，等价于"U + %04X"

	var n int = 19
	var n2 float32 = 1.99
	var n3 bool = false
	var n4 byte = 'a'

	var s1 string = fmt.Sprintf("%d", n)
	fmt.Printf("s1类型：%T，s1= %q", s1, s1)

	var s2 string = fmt.Sprintf("%f", n2)
	fmt.Printf("s2类型：%T，s2= %q", s2, s2)

	var s3 string = fmt.Sprintf("%t", n3)
	fmt.Printf("s1类型：%T，s1= %q", s3, s3)

	fmt.Printf(string(n4))

	//	还可以受用strconv

}

func strconvData() {
	// string --> bool
	var s1 string = "true"
	var b bool

	// _表示忽略该变量
	b, _ = strconv.ParseBool(s1)
	fmt.Printf("b的类型 %T,b=%v", b, b)

	//	string --> int64
	var s2 string = "19"
	var num1 int64
	// base 10进制  bitSize表示位数
	num1, _ = strconv.ParseInt(s2, 10, 64)
	fmt.Printf("num1的类型是：%T,num1= %v", num1, num1)

	fmt.Println()
	//	string --> float64
	var s3 string = "19.99"
	var num2 float64
	// base 10进制  bitSize表示位数
	num2, _ = strconv.ParseFloat(s3, 64)
	fmt.Printf("num2的类型是：%T,num2= %v", num2, num2)
}

func pointAddress() {
	var age = 18

	// 内存地址
	fmt.Println(&age)

	// *int 是指针类型(可以理解为指向int类型的指针)
	// &age就是一个地址，是ptr变量的具体值
	var pointer *int = &age
	fmt.Println(pointer)
	fmt.Println(&pointer)

	//	pointer是指针，如何获取指针指向的值？
	fmt.Println(*pointer)
	fmt.Println(*&pointer)

	//	可以通过指针改变指针指向的值
	var score int = 100
	var ptSc *int = &score
	*ptSc = 60

	fmt.Println("score==>", score)

}

func flagName() {

	var int int = 29
	fmt.Println(int)

	//	 利用首字母大小写完成对包内变量的访问
}
